package TP6.implementation;

import TP2.TDA.ConjuntoTDA;
import TP2.implementation.ConjuntoTamNoAcotListaImpl1;
import TP6.TDA.GrafoTDA;

public class GrafoArrayImpl implements GrafoTDA {
	public static final int MAX_NODES_QTY = 9;
	int [] [] adyacencia;
	int [] etiquetas;
	int cant = 0;

	public void inicializar() {
		adyacencia = new int [MAX_NODES_QTY] [MAX_NODES_QTY];
		etiquetas = new int [MAX_NODES_QTY];
	}

	public void agregarVertice(int v) {
		etiquetas[cant] = v;
		
		for(int i = 0; i <= cant; i++) {
			adyacencia[i][cant] = 0;
			adyacencia[cant][i] = 0;
		}
		
		cant++;
	}

	public void eliminarVertice(int v) {
		/*
		 * Desplazando todo..
		 */
//		int index = getIndice(v);
//		cant--;
//		for (int i = index; i < cant; i++) {
//			etiquetas[i] = etiquetas[i + 1];
//			adyacencia[i] = adyacencia[i + 1];
//		}
//		for (int i = 0; i < cant; i++) {
//			for (int j = index; j < cant; j++) {
//				adyacencia[i][j] = adyacencia[i][j + 1];
//			}
//		}
		
		/*
		 * Otra forma
		 */
		int index = getIndice(v);
		cant--;
		etiquetas[index] = etiquetas[cant];
//		adyacencia[index] = adyacencia[cant];	// Esto equivale a iterar en el for haciendo "adyacencia[index][i] = adyacencia[cant][i];"
		for (int i = 0; i < cant; i++) {
			adyacencia[i][index] = adyacencia[i][cant];
			adyacencia[index][i] = adyacencia[cant][i];
		}
	}

	public ConjuntoTDA vertices() {
		ConjuntoTDA vertices = new ConjuntoTamNoAcotListaImpl1();
		vertices.inicializar();
		
		for(int i = 0; i < cant; i++) {
			vertices.agregar(etiquetas[i]);
		}
		
		return vertices;
	}

	public void agregarArista(int origen, int destino, int peso) {		
		adyacencia[getIndice(origen)][getIndice(destino)] = peso;
	}

	public void eliminarArista(int origen, int destino) {
		adyacencia[getIndice(origen)][getIndice(destino)] = 0;
	}

	public boolean existeArista(int origen, int destino) {
		return pesoArista(origen, destino) != 0;
	}

	public int pesoArista(int origen, int destino) {
		return adyacencia[getIndice(origen)][getIndice(destino)];
	}
	
	private int getIndice(int vertice) {
		int index = -1;
		
		for (int i = 0; i < cant; i++) {
			if(etiquetas[i] == vertice) {
				index = i;
				break;
			}
		}
		
		return index;
	}

}
